"""
模板管理API
处理文档转换模板的管理请求
"""

import logging
import os
from flask import request, jsonify, current_app, send_file
from werkzeug.utils import secure_filename
from . import api_bp
from ..services.template_service import TemplateService
from ..utils.auth_utils import require_auth, get_current_user, require_admin
from ..utils.validation_utils import ValidationUtils

logger = logging.getLogger(__name__)

@api_bp.route('/templates', methods=['GET'])
def get_templates():
    """
    获取模板列表
    
    Returns:
        JSON响应包含模板列表
    """
    try:
        # 获取查询参数
        template_type = request.args.get('type')
        format_type = request.args.get('format')
        limit = int(request.args.get('limit', 50))
        offset = int(request.args.get('offset', 0))
        
        if limit > 100:
            limit = 100
        
        # 获取模板列表
        template_service = TemplateService(current_app)
        result = template_service.list_templates(template_type, format_type, limit, offset)
        
        if not result['success']:
            return jsonify({'error': result['error']}), 400
        
        return jsonify({
            'success': True,
            'templates': result['templates'],
            'total': result['total'],
            'limit': limit,
            'offset': offset
        }), 200
        
    except Exception as e:
        logger.error(f"获取模板列表失败: {str(e)}")
        return jsonify({'error': '获取模板列表失败'}), 500

@api_bp.route('/templates/<template_id>', methods=['GET'])
def get_template(template_id):
    """
    获取模板详情
    
    Args:
        template_id: 模板ID
        
    Returns:
        JSON响应包含模板详情
    """
    try:
        # 获取模板详情
        template_service = TemplateService(current_app)
        result = template_service.get_template(template_id)
        
        if not result['success']:
            return jsonify({'error': result['error']}), 404
        
        return jsonify({
            'success': True,
            'template': result['template']
        }), 200
        
    except Exception as e:
        logger.error(f"获取模板详情失败: {str(e)}")
        return jsonify({'error': '获取模板详情失败'}), 500

@api_bp.route('/templates/default', methods=['GET'])
def get_default_templates():
    """
    获取默认模板
    
    Returns:
        JSON响应包含默认模板
    """
    try:
        # 获取查询参数
        template_type = request.args.get('type')
        format_type = request.args.get('format')
        
        # 获取默认模板
        template_service = TemplateService(current_app)
        result = template_service.get_default_template(template_type, format_type)
        
        if not result['success']:
            return jsonify({'error': result['error']}), 404
        
        return jsonify({
            'success': True,
            'template': result['template']
        }), 200
        
    except Exception as e:
        logger.error(f"获取默认模板失败: {str(e)}")
        return jsonify({'error': '获取默认模板失败'}), 500

@api_bp.route('/templates', methods=['POST'])
@require_auth
def create_template():
    """
    创建模板
    
    Returns:
        JSON响应包含创建结果
    """
    try:
        current_user = get_current_user()
        if not current_user:
            return jsonify({'error': '用户未认证'}), 401
        
        user_id = current_user['id']
        
        # 检查是否为管理员
        if current_user.get('role') != 'admin':
            return jsonify({'error': '权限不足'}), 403
        
        data = request.get_json()
        if not data:
            return jsonify({'error': '缺少请求数据'}), 400
        
        name = data.get('name', '').strip()
        description = data.get('description', '').strip()
        template_type = data.get('type', '').strip()
        format_type = data.get('format', '').strip()
        content = data.get('content', '').strip()
        
        if not all([name, template_type, format_type, content]):
            return jsonify({'error': '模板名称、类型、格式和内容不能为空'}), 400
        
        # 创建模板
        template_service = TemplateService(current_app)
        result = template_service.create_template(
            name=name,
            description=description,
            template_type=template_type,
            format_type=format_type,
            content=content,
            created_by=user_id
        )
        
        if not result['success']:
            return jsonify({'error': result['error']}), 400
        
        logger.info(f"模板创建成功: {name} by {current_user['username']}")
        
        return jsonify({
            'success': True,
            'message': '模板创建成功',
            'template_id': result['template_id']
        }), 201
        
    except Exception as e:
        logger.error(f"创建模板失败: {str(e)}")
        return jsonify({'error': '创建模板失败'}), 500

@api_bp.route('/templates/<template_id>', methods=['PUT'])
@require_auth
def update_template(template_id):
    """
    更新模板
    
    Args:
        template_id: 模板ID
        
    Returns:
        JSON响应包含更新结果
    """
    try:
        current_user = get_current_user()
        if not current_user:
            return jsonify({'error': '用户未认证'}), 401
        
        # 检查是否为管理员
        if current_user.get('role') != 'admin':
            return jsonify({'error': '权限不足'}), 403
        
        data = request.get_json()
        if not data:
            return jsonify({'error': '缺少请求数据'}), 400
        
        # 更新模板
        template_service = TemplateService(current_app)
        result = template_service.update_template(template_id, data)
        
        if not result['success']:
            return jsonify({'error': result['error']}), 400
        
        logger.info(f"模板更新成功: {template_id} by {current_user['username']}")
        
        return jsonify({
            'success': True,
            'message': '模板更新成功'
        }), 200
        
    except Exception as e:
        logger.error(f"更新模板失败: {str(e)}")
        return jsonify({'error': '更新模板失败'}), 500

@api_bp.route('/templates/<template_id>', methods=['DELETE'])
@require_auth
def delete_template(template_id):
    """
    删除模板
    
    Args:
        template_id: 模板ID
        
    Returns:
        JSON响应包含删除结果
    """
    try:
        current_user = get_current_user()
        if not current_user:
            return jsonify({'error': '用户未认证'}), 401
        
        # 检查是否为管理员
        if current_user.get('role') != 'admin':
            return jsonify({'error': '权限不足'}), 403
        
        # 删除模板
        template_service = TemplateService(current_app)
        result = template_service.delete_template(template_id)
        
        if not result['success']:
            return jsonify({'error': result['error']}), 400
        
        logger.info(f"模板删除成功: {template_id} by {current_user['username']}")
        
        return jsonify({
            'success': True,
            'message': '模板删除成功'
        }), 200
        
    except Exception as e:
        logger.error(f"删除模板失败: {str(e)}")
        return jsonify({'error': '删除模板失败'}), 500

@api_bp.route('/templates/<template_id>/use', methods=['POST'])
@require_auth
def use_template(template_id):
    """
    使用模板
    
    Args:
        template_id: 模板ID
        
    Returns:
        JSON响应包含使用结果
    """
    try:
        current_user = get_current_user()
        if not current_user:
            return jsonify({'error': '用户未认证'}), 401
        
        user_id = current_user['id']
        
        # 使用模板
        template_service = TemplateService(current_app)
        result = template_service.use_template(template_id, user_id)
        
        if not result['success']:
            return jsonify({'error': result['error']}), 400
        
        return jsonify({
            'success': True,
            'template': result['template']
        }), 200
        
    except Exception as e:
        logger.error(f"使用模板失败: {str(e)}")
        return jsonify({'error': '使用模板失败'}), 500

@api_bp.route('/templates/<template_id>/rate', methods=['POST'])
@require_auth
def rate_template(template_id):
    """
    评价模板
    
    Args:
        template_id: 模板ID
        
    Returns:
        JSON响应包含评价结果
    """
    try:
        current_user = get_current_user()
        if not current_user:
            return jsonify({'error': '用户未认证'}), 401
        
        user_id = current_user['id']
        
        data = request.get_json()
        if not data:
            return jsonify({'error': '缺少请求数据'}), 400
        
        rating = data.get('rating')
        comment = data.get('comment', '').strip()
        
        if rating is None or not isinstance(rating, (int, float)):
            return jsonify({'error': '评分不能为空且必须为数字'}), 400
        
        if rating < 1 or rating > 5:
            return jsonify({'error': '评分必须在1-5之间'}), 400
        
        # 评价模板
        template_service = TemplateService(current_app)
        result = template_service.rate_template(template_id, user_id, rating, comment)
        
        if not result['success']:
            return jsonify({'error': result['error']}), 400
        
        return jsonify({
            'success': True,
            'message': '评价成功'
        }), 200
        
    except Exception as e:
        logger.error(f"评价模板失败: {str(e)}")
        return jsonify({'error': '评价失败'}), 500

@api_bp.route('/templates/<template_id>/default', methods=['POST'])
@require_admin
def set_default_template(template_id):
    """
    设置默认模板
    
    Args:
        template_id: 模板ID
        
    Returns:
        JSON响应包含设置结果
    """
    try:
        # 设置默认模板
        template_service = TemplateService(current_app)
        result = template_service.set_default_template(template_id)
        
        if not result['success']:
            return jsonify({'error': result['error']}), 400
        
        current_user = get_current_user()
        logger.info(f"默认模板设置成功: {template_id} by {current_user['username']}")
        
        return jsonify({
            'success': True,
            'message': '默认模板设置成功'
        }), 200
        
    except Exception as e:
        logger.error(f"设置默认模板失败: {str(e)}")
        return jsonify({'error': '设置失败'}), 500

@api_bp.route('/templates/<template_id>/activate', methods=['POST'])
@require_admin
def activate_template(template_id):
    """
    激活模板
    
    Args:
        template_id: 模板ID
        
    Returns:
        JSON响应包含激活结果
    """
    try:
        # 激活模板
        template_service = TemplateService(current_app)
        result = template_service.activate_template(template_id)
        
        if not result['success']:
            return jsonify({'error': result['error']}), 400
        
        current_user = get_current_user()
        logger.info(f"模板激活成功: {template_id} by {current_user['username']}")
        
        return jsonify({
            'success': True,
            'message': '模板激活成功'
        }), 200
        
    except Exception as e:
        logger.error(f"激活模板失败: {str(e)}")
        return jsonify({'error': '激活失败'}), 500

@api_bp.route('/templates/<template_id>/deactivate', methods=['POST'])
@require_admin
def deactivate_template(template_id):
    """
    停用模板
    
    Args:
        template_id: 模板ID
        
    Returns:
        JSON响应包含停用结果
    """
    try:
        # 停用模板
        template_service = TemplateService(current_app)
        result = template_service.deactivate_template(template_id)
        
        if not result['success']:
            return jsonify({'error': result['error']}), 400
        
        current_user = get_current_user()
        logger.info(f"模板停用成功: {template_id} by {current_user['username']}")
        
        return jsonify({
            'success': True,
            'message': '模板停用成功'
        }), 200
        
    except Exception as e:
        logger.error(f"停用模板失败: {str(e)}")
        return jsonify({'error': '停用失败'}), 500

@api_bp.route('/templates/upload', methods=['POST'])
@require_admin
def upload_template():
    """
    上传模板文件
    
    Returns:
        JSON响应包含上传结果
    """
    try:
        current_user = get_current_user()
        if not current_user:
            return jsonify({'error': '用户未认证'}), 401
        
        # 检查文件
        if 'file' not in request.files:
            return jsonify({'error': '没有上传文件'}), 400
        
        file = request.files['file']
        if file.filename == '':
            return jsonify({'error': '文件名不能为空'}), 400
        
        # 获取表单数据
        name = request.form.get('name', '').strip()
        description = request.form.get('description', '').strip()
        template_type = request.form.get('type', '').strip()
        format_type = request.form.get('format', '').strip()
        
        if not all([name, template_type, format_type]):
            return jsonify({'error': '模板名称、类型和格式不能为空'}), 400
        
        # 验证文件类型
        allowed_extensions = {'.html', '.css', '.json', '.xml', '.txt'}
        filename = secure_filename(file.filename)
        file_ext = os.path.splitext(filename)[1].lower()
        
        if file_ext not in allowed_extensions:
            return jsonify({'error': f'不支持的文件类型: {file_ext}'}), 400
        
        # 读取文件内容
        try:
            content = file.read().decode('utf-8')
        except UnicodeDecodeError:
            return jsonify({'error': '文件编码不正确，请使用UTF-8编码'}), 400
        
        # 创建模板
        template_service = TemplateService(current_app)
        result = template_service.create_template(
            name=name,
            description=description,
            template_type=template_type,
            format_type=format_type,
            content=content,
            created_by=current_user['id']
        )
        
        if not result['success']:
            return jsonify({'error': result['error']}), 400
        
        logger.info(f"模板文件上传成功: {name} by {current_user['username']}")
        
        return jsonify({
            'success': True,
            'message': '模板上传成功',
            'template_id': result['template_id']
        }), 201
        
    except Exception as e:
        logger.error(f"上传模板文件失败: {str(e)}")
        return jsonify({'error': '上传失败'}), 500

@api_bp.route('/templates/<template_id>/export', methods=['GET'])
@require_admin
def export_template(template_id):
    """
    导出模板
    
    Args:
        template_id: 模板ID
        
    Returns:
        模板文件下载
    """
    try:
        # 导出模板
        template_service = TemplateService(current_app)
        result = template_service.export_template(template_id)
        
        if not result['success']:
            return jsonify({'error': result['error']}), 400
        
        file_path = result['file_path']
        filename = result['filename']
        
        current_user = get_current_user()
        logger.info(f"模板导出成功: {template_id} by {current_user['username']}")
        
        return send_file(
            file_path,
            as_attachment=True,
            download_name=filename,
            mimetype='application/octet-stream'
        )
        
    except Exception as e:
        logger.error(f"导出模板失败: {str(e)}")
        return jsonify({'error': '导出失败'}), 500

@api_bp.route('/templates/import', methods=['POST'])
@require_admin
def import_template():
    """
    导入模板
    
    Returns:
        JSON响应包含导入结果
    """
    try:
        current_user = get_current_user()
        if not current_user:
            return jsonify({'error': '用户未认证'}), 401
        
        # 检查文件
        if 'file' not in request.files:
            return jsonify({'error': '没有上传文件'}), 400
        
        file = request.files['file']
        if file.filename == '':
            return jsonify({'error': '文件名不能为空'}), 400
        
        # 验证文件类型
        filename = secure_filename(file.filename)
        if not filename.endswith('.json'):
            return jsonify({'error': '只支持JSON格式的模板文件'}), 400
        
        # 导入模板
        template_service = TemplateService(current_app)
        result = template_service.import_template(file, current_user['id'])
        
        if not result['success']:
            return jsonify({'error': result['error']}), 400
        
        logger.info(f"模板导入成功: {filename} by {current_user['username']}")
        
        return jsonify({
            'success': True,
            'message': '模板导入成功',
            'imported_count': result['imported_count']
        }), 201
        
    except Exception as e:
        logger.error(f"导入模板失败: {str(e)}")
        return jsonify({'error': '导入失败'}), 500

@api_bp.route('/templates/statistics', methods=['GET'])
@require_admin
def get_template_statistics():
    """
    获取模板统计信息
    
    Returns:
        JSON响应包含统计信息
    """
    try:
        # 获取模板统计
        template_service = TemplateService(current_app)
        result = template_service.get_template_statistics()
        
        if not result['success']:
            return jsonify({'error': result['error']}), 400
        
        return jsonify({
            'success': True,
            'statistics': result['statistics']
        }), 200
        
    except Exception as e:
        logger.error(f"获取模板统计失败: {str(e)}")
        return jsonify({'error': '获取统计信息失败'}), 500